package com.pe.pgn.clubpgn.dao.impl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.ClientePersonaDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbClientePersona;
import com.pe.pgn.clubpgn.domain.ClpbEmpresaCelular;
import com.pe.pgn.clubpgn.domain.ClpbEstadoCivil;
import com.pe.pgn.clubpgn.domain.ClpbTipoDocumentoPersona;
import com.pe.pgn.clubpgn.domain.ClpmUbigeo;
import com.pe.pgn.clubpgn.domain.beans.BNClientesPersona;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

/**
 * @author Edwin Farfan
 */

@SuppressWarnings("unchecked")
@Repository("clientePersonaDao")
public class ClientePersonaDaoImpl extends GenericDaoHibernate<ClpbClientePersona, Long> implements ClientePersonaDao {
	
	JdbcTemplate jdbcTemplate;
		
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
		}
	
	public ClientePersonaDaoImpl() {
		super(ClpbClientePersona.class);
	}

	public void eliminarClientePersona(Long id) {
		ClpbClientePersona cliente = get(id);
		cliente.setStClientePersona(Boolean.FALSE);
		cliente.setStHabilitado(Boolean.FALSE);
		guardarClientePersona(cliente);
		
	}

	public void guardarClientePersona(ClpbClientePersona clientePersona) {
		
		if(clientePersona.getId() == null){
			
			clientePersona.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			clientePersona.setDaFechaCreacion(Calendar.getInstance());
		}
		else{
			clientePersona.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
			clientePersona.setDaFechaModificacion(Calendar.getInstance());
		}
		
		getHibernateTemplate().saveOrUpdate(clientePersona);
		getHibernateTemplate().flush();
		
	}

	public BNClientesPersona obtenerClientePersona(Long id) {
		
		BNClientesPersona bnCliente = new BNClientesPersona();
		
		try {
		
			StringBuffer query = new StringBuffer();
			query.append(" select");		
			query.append(" cp.id, ");
			query.append(" cp.co_codprov_celular 		as codProvCelular, ");
			query.append(" cp.co_celular 				as coCelular, ");
			query.append(" cp.co_code_numero_documento 	as coCodeNumeroDocumento, ");
			query.append(" cp.co_codprov_telefono 		as codProvTelefono, ");
			query.append(" cp.co_telefono_fijo 			as coTelefonoFijo, ");
			query.append(" cp.de_ape_materno 			as deApeMaterno, ");
			query.append(" cp.de_ape_paterno 			as deApePaterno, ");
			query.append(" cp.de_comentario_habilitado 	as deComentarioHabilitado, ");
			
			query.append(" cp.jr_direccion 				as jrDireccion, ");
			query.append(" cp.nombre_direccion 			as nombreDireccion, ");
			query.append(" cp.numero_direccion 			as numeroDireccion, ");
			query.append(" cp.mz_direccion 				as mzDireccion, ");
			query.append(" cp.dpto_direccion 			as dptoDireccion, ");
			query.append(" cp.nombre_urb_direccion 		as nombreUrbDireccion, ");
			query.append(" cp.sec_direccion 			as secDireccion, ");
			
			query.append(" cp.de_sexo 					as coSexo, ");
			query.append(" cp.de_sexo 					as sexo, ");
			query.append(" cp.de_tienehijo 				as tienehijo, ");
			query.append(" cp.de_tieneauto 				as tieneauto, ");
			query.append(" cp.de_mail 					as deMail, ");
			query.append(" cp.de_nombre 				as deNombre, ");
			query.append(" cp.st_cliente_persona 		as stClienteActivo, ");
			query.append(" cp.st_habilitado 			as stTarjetaAsignada, ");
			query.append(" cp.co_empresa_celular 		as coEmpresaCelular, ");
			query.append(" ec.de_empresa_celular 		as deEmpresaCelular, ");
			query.append(" cp.co_estado_civil 			as coEstadoCivil, ");
			query.append(" sc.de_estado_civil 			as deEstadoCivil, ");
			query.append(" cp.co_tarjeta_persona 		as coTarjetaPersona_code, ");
			query.append(" tp.co_codigo_tarjeta_persona as coTarjetaPersona_text, ");
			query.append(" tp.co_codigo_tarjeta_persona as coTarjetaPersona_text_inicial, ");
			query.append(" cp.co_tipo_documento 		as coTipoDocumento, ");
			query.append(" td.de_tipo_documento_persona	as deTipoDocumentoPersona, ");
			query.append(" cp.co_ubigeo 				as coUbigeo,");
			query.append(" ub.co_departamento 			as coDepartamento, ");
			query.append(" ub.co_provincia 				as coProvincia, ");
			query.append(" ub.co_distrito 				as coDistrito, ");
			query.append(" ub.de_departamento 			as deDepartamento, ");
			query.append(" ub.de_provincia 				as deProvincia, ");
			query.append(" ub.de_distrito 				as deDistrito, ");
			query.append(" to_char(cast(cp.da_fecha_inscripcion as date), '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_BD+"') as fechaInscripcion, ");
			query.append(" to_char(cast(cp.da_fecha_nacimiento  as date), '"+CLPConstantes.DATE_PATTERN+"') as fechaNacimiento 	");
			
			query.append(" from clpb_cliente_persona cp ");
			query.append(" left join clpb_empresa_celular ec ");
			query.append(" 	on ec.id = cp.co_empresa_celular ");
			query.append(" left join clpb_estado_civil sc ");
			query.append(" 	on sc.id = cp.co_estado_civil ");
			query.append(" left join clpb_tarjeta_persona tp ");
			query.append(" 	on tp.id = cp.co_tarjeta_persona ");
			query.append(" left join clpb_tipo_documento_persona td ");
			query.append(" 	on td.id = cp.co_tipo_documento ");
			query.append(" left join clpm_ubigeo ub ");
			query.append(" 	on ub.id = cp.co_ubigeo ");
			query.append(" where cp.id  = ").append(id);
			
			List list = findListOfBeans(query.toString(),null,BNClientesPersona.class);
			if(list != null && list.size() > 0){
				
				bnCliente = (BNClientesPersona)list.get(0);
				String desFechaInscripcion = bnCliente.getFechaInscripcion();
				String desFechaNacimiento  = bnCliente.getFechaNacimiento();
				String coEmpresaCelular    = bnCliente.getCoEmpresaCelular();
				String deEmpresaCelular    = bnCliente.getDeEmpresaCelular();
				String coEstadoCivil       = bnCliente.getCoEstadoCivil();
				String deEstadoCivil   	   = bnCliente.getDeEstadoCivil();
				String coUbigeo    		   = bnCliente.getCoUbigeo();
				String coTipoDocumentoPersona = bnCliente.getCoTipoDocumento();
				String deTipoDocumentoPersona = bnCliente.getDeTipoDocumento();
				
				
				if(ValidationUtil.isValidateString(desFechaInscripcion)){
					bnCliente.setDaFechaInscripcion(CalendarUtil.stringToCalendar
					(CLPConstantes.FORMATO_FECHA_CLUB_PGN,desFechaInscripcion));
				}
				
				if(ValidationUtil.isValidateString(desFechaNacimiento)){
					bnCliente.setDaFechaNacimiento(CalendarUtil.stringToCalendar
					(CLPConstantes.DATE_PATTERN,desFechaNacimiento));
				}
				
				if(ValidationUtil.isValidateString(coEmpresaCelular)){
					ClpbEmpresaCelular empresaCelular = new ClpbEmpresaCelular();
					empresaCelular.setId(new Long(coEmpresaCelular));
					empresaCelular.setDeEmpresaCelular(deEmpresaCelular);
					bnCliente.setClpbEmpresaCelular(empresaCelular);
				}
				
				if(ValidationUtil.isValidateString(coEstadoCivil)){
					ClpbEstadoCivil estadoCivil = new ClpbEstadoCivil();
					estadoCivil.setId(new Long(coEstadoCivil));
					estadoCivil.setDeEstadoCivil(deEstadoCivil);
					bnCliente.setClpbEstadoCivil(estadoCivil);
				}
				
				if(ValidationUtil.isValidateString(coTipoDocumentoPersona)){
					ClpbTipoDocumentoPersona tipoDocumento = new ClpbTipoDocumentoPersona();
					tipoDocumento.setId(new Long(coTipoDocumentoPersona));
					tipoDocumento.setDeTipoDocumentoPersona(deTipoDocumentoPersona);
					bnCliente.setClpbTipoDocumentoPersona(tipoDocumento);
				}
				
				if(ValidationUtil.isValidateString(coUbigeo)){
					ClpmUbigeo ubigeo = new ClpmUbigeo();
					ubigeo.setId(new Long(coUbigeo));
					bnCliente.setClpmUbigeo(ubigeo);
				}
				
			}
		
		}catch(Exception e){
			System.out.println(""+e.getMessage());
		}
		
		return bnCliente;		
	}

	public List<ClpbClientePersona> obtenerClientePersonas() {
		Criteria criteria = DetachedCriteria.forClass(ClpbClientePersona.class)
		.getExecutableCriteria(getSessionFactory().getCurrentSession());
	
		criteria.setMaxResults(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		criteria.add(Restrictions.eq("stClientePersona", Boolean.TRUE));
		criteria.addOrder(Order.desc("id"));
	
		List<ClpbClientePersona> lista = criteria.list();
			
		return lista;
	}
	
	public List<BNClientesPersona> busquedaClientesPorFiltros(String nroDocumento, String cliente, String eliminado, String habilitado, 
		String fechaInicio,String fechaFinal){
		
		StringBuffer sql= new StringBuffer();
		sql.append(" select cliente.id as id, ");
		
		sql.append(" cliente.de_nombre as denombre, ");
		sql.append(" cliente.de_ape_paterno as deapepaterno, ");
		sql.append(" cliente.de_ape_materno as deapematerno, ");
		sql.append(" to_char(cliente.da_fecha_inscripcion,'dd/MM/YYYY') as fechaInscripcion, ");
		sql.append(" co_code_numero_documento as coCodeNumeroDocumento, ");
		sql.append(" st_habilitado as habilitado, ");
		sql.append(" 		st_cliente_persona as eliminado, ");
		sql.append(" 		ea.de_empresa_afiliadora as deEmpresaAfiliadora ");
		sql.append(" from clpb_cliente_persona cliente left outer join clpb_empresa_afiliadora ea  ");
		sql.append("	on cliente.co_empresa_afiliadora = ea.id ");
		sql.append(" where 1=1 ");
		
		
		if(StringUtils.isNotBlank(nroDocumento))
			sql.append(" and cliente.co_code_numero_documento like ('%"+nroDocumento+"%') ");
		
		if(StringUtils.isNotBlank(cliente)){
			
			String deCliente = "";
			String[] arrayCliente = cliente.trim().split(" ");
			if(arrayCliente.length > 1){
				for (String strCliente : arrayCliente) {
					deCliente += strCliente+"%";
				}
				
				if(deCliente.endsWith("%")){
					deCliente = deCliente.substring(0, deCliente.length()-1);
				}
			}else{
				deCliente = cliente.trim();
			}
			
			sql.append(" and upper(trim(cliente.de_nombre)||' '|| trim(cliente.de_ape_paterno)||' '||trim(cliente.de_ape_materno)) like upper('%"+deCliente+"%') ");
		}
		
		if(StringUtils.isNotBlank(eliminado) && !eliminado.equalsIgnoreCase(CLPConstantes.CARACTER_GUION_NO_ESPACIOS)){
			
			if(eliminado.equals("Y")){ //los que estan eliminados estan con estado 'N'
				sql.append(" and cliente.st_cliente_persona='N' ");
			}else{
				sql.append(" and cliente.st_cliente_persona='Y' ");
			}			
		}
		
		if(StringUtils.isNotBlank(habilitado)&& !habilitado.equalsIgnoreCase(CLPConstantes.CARACTER_GUION_NO_ESPACIOS))
			sql.append(" and cliente.st_habilitado='"+habilitado+"' ");
		
		if(StringUtils.isNotBlank(fechaInicio))
		sql.append(" and cliente.da_fecha_inscripcion >= TO_DATE('"+fechaInicio+"','"+CLPConstantes.DATE_PATTERN+"')");
		
		if(StringUtils.isNotBlank(fechaFinal))
		sql.append(" and cliente.da_fecha_inscripcion <= TO_DATE('"+fechaFinal+"','"+CLPConstantes.DATE_PATTERN+"')");

		sql.append(" order by cliente.id desc");
		log.info("Busqueda de clientes::::::::"+sql.toString());
		
		List<BNClientesPersona> listaClientes= findListOfBeans(sql.toString(), null, BNClientesPersona.class);
		
		return listaClientes;
	}
	
	public List<ClpbTipoDocumentoPersona> listadoDocumentoPersonas(){
		return getHibernateTemplate().loadAll(ClpbTipoDocumentoPersona.class);	
	}
	public List<ClpmUbigeo> listadoDistritos(){
		return getHibernateTemplate().loadAll(ClpmUbigeo.class);
	}
	public List<ClpbEmpresaCelular> listadoEmpresaCelular(){
		return getHibernateTemplate().loadAll(ClpbEmpresaCelular.class);
	}
	public List<ClpbEstadoCivil> listadoEstadoCivil(){
		return getHibernateTemplate().loadAll(ClpbEstadoCivil.class);
	}
	
	public List<Map<String, Object>> verificarDuplicidadDocumento(String documento){
		
		StringBuffer sql= new StringBuffer();
		
		sql.append("select * from clpb_cliente_persona ");
		sql.append("where st_cliente_persona='"+CLPConstantes.ST_VERDADERO+"'");
		sql.append("and co_code_numero_documento=trim('"+documento+"')");

		return jdbcTemplate.queryForList(sql.toString());
		
	}

	public int validaDocumento(Long id) {
		StringBuffer sql=new StringBuffer();
			sql.append("select va_numero_caracteres as caracteres ");
			sql.append(" from clpb_tipo_documento_persona ");
			sql.append(" where id="+id);
		
		return jdbcTemplate.queryForInt(sql.toString());
	}
	
	public boolean clienteTieneDependencias(Long id ){
		
		String historiaLiquidacion="select count(*) from clpm_historial_liquidacion where co_cliente_persona="+id+" and st_liquidacion='"+CLPConstantes.ST_VERDADERO+"'";
		String liquidacion="select count(*) from clpm_liquidacion where co_cliente_persona="+id+" and st_liquidacion='"+CLPConstantes.ST_VERDADERO+"'";
		String clientePrograma="select count(*) from clpr_cliente_programa where clpb_cliente_persona="+id+" and st_cliente_programa='"+CLPConstantes.ST_VERDADERO+"'";
		String clientePuntos="select count(*) from clpm_puntos_periodo_cliente where co_cliente_persona="+id+" and st_puntos_periodo_cliente='"+CLPConstantes.ST_VERDADERO+"'";
		String tarjetaPersona="select count(*) from clpb_tarjeta_persona where co_cliente_persona="+id+" and st_tarjeta_persona='"+CLPConstantes.ST_VERDADERO+"'";
		String venta="select count(*) from clpm_venta where clpb_cliente_persona="+id+" and st_venta='"+CLPConstantes.VENTA_ACTIVA+"'";
		
		int regHistorial = jdbcTemplate.queryForInt(historiaLiquidacion);
		int regLiquidacion =jdbcTemplate.queryForInt(liquidacion);
		int regClientePrograma= jdbcTemplate.queryForInt(clientePrograma);
		int regClientePuntos= jdbcTemplate.queryForInt(clientePuntos);
		int regTarjetaPersona= jdbcTemplate.queryForInt(tarjetaPersona);
		int regVenta= jdbcTemplate.queryForInt(venta);
		
		
		if(regHistorial>0 ||regLiquidacion>0||regClientePrograma>0||regClientePuntos>0||regTarjetaPersona>0||regVenta>0){
			return true;
		}
		
		return false;
	}

	public List<BNClientesPersona> obtenerBNClientePersonas() {

		StringBuffer sql= new StringBuffer();
		sql.append(" select * from (");
		sql.append(" select cliente.id as id, ");		
		sql.append(" 	cliente.de_nombre as denombre, ");
		sql.append(" 	cliente.de_ape_paterno as deapepaterno, ");
		sql.append(" 	cliente.de_ape_materno as deapematerno, ");
		sql.append(" 	to_char(cliente.da_fecha_inscripcion,'dd/MM/YYYY') as fechaInscripcion, ");
		sql.append(" 	co_code_numero_documento as coCodeNumeroDocumento, ");
		sql.append(" 	st_habilitado as habilitado, ");
		sql.append(" 	st_cliente_persona as eliminado, ");
		sql.append("	ea.de_empresa_afiliadora as deEmpresaAfiliadora ");
		sql.append(" from clpb_cliente_persona cliente left outer join clpb_empresa_afiliadora ea  ");
		sql.append("	on cliente.co_empresa_afiliadora = ea.id ");
		sql.append(" where cliente.st_cliente_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		sql.append(" order by cliente.id desc ");
		sql.append(" ) sclt where rownum <= ").append(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		
		List<BNClientesPersona> listaClientes = findListOfBeans(sql.toString(), null, BNClientesPersona.class);
		return listaClientes;
	}

	public List<BNClientesPersona> obtenerListaClientesPersona()
			throws Exception {
		
		StringBuffer query = new StringBuffer();
		query.append(" select * from (");
		query.append(" select ");
		query.append("	cliente.id, ");
		query.append(" 	cliente.de_nombre as deNombre, ");
		query.append(" 	cliente.de_ape_paterno as deApePaterno, ");
		query.append(" 	cliente.de_ape_materno as deApeMaterno, ");
		query.append(" 	cliente.co_code_numero_documento as coCodeNumeroDocumento, ");
		query.append(" 	trim(cliente.de_nombre)||' '|| trim(cliente.de_ape_paterno)||' '||trim(cliente.de_ape_materno) as deClientePersona, ");
		
		query.append("	ub.de_departamento as deDepartamento, ");
		query.append("	ub.de_provincia as deProvincia, ");
		query.append("	ub.de_distrito as deDistrito, ");
		query.append("	ec.de_estado_civil as deEstadoCivil ");
		
		query.append(" from clpb_cliente_persona cliente ");
		query.append(" inner join clpm_ubigeo ub on cliente.co_ubigeo = ub.id ");
		query.append(" inner join clpb_estado_civil ec on cliente.co_estado_civil = ec.id ");
		query.append(" inner join clpb_tarjeta_persona tp on cliente.co_tarjeta_persona = tp.id ");
		
		query.append(" where cliente.st_cliente_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and cliente.st_habilitado = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and tp.st_tarjeta_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and tp.da_fecha_anulacion is null ");
		query.append(" order by cliente.id desc ");
		query.append(" ) sclt where rownum <= ").append(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		
		System.out.println("* ClientePersonaDaoImpl.obtenerListaClientesPersona: "+query.toString());
		return findListOfBeans(query.toString(), null, BNClientesPersona.class);
	}

	public List<ClpbEstadoCivil> listarEstadosCiviles(boolean addItemDefault) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	id, ");
		query.append(" 	de_estado_civil as deEstadoCivil  ");
		query.append(" from clpb_estado_civil ");
		query.append(" where st_estado_civil = '"+CLPConstantes.ST_VERDADERO+"'");
		query.append(" order by de_estado_civil asc ");
		
		List<ClpbEstadoCivil> listObj = new ArrayList<ClpbEstadoCivil>();
		List<ClpbEstadoCivil> lista   = findListOfBeans(query.toString(), null, ClpbEstadoCivil.class);
		
		if(addItemDefault){
			ClpbEstadoCivil bean = new ClpbEstadoCivil();
			bean.setId(new Long("-1"));
			bean.setDeEstadoCivil("----");
			listObj.add(bean);
		}
		
		listObj.addAll(lista);
		return listObj;
	}
	
	public int obtenerNumeroClientes(String[] filters) {
		
		String deNombre = "";
		String deApellidoPaterno = "";
		String deApellidoMaterno = "";
		String deDocIdentidad = "";
		String coDepartamento = "";
		String coProvincia = "";
		String coDistrito = "";
		String coEstadoCivil = "";
		
		if(filters != null && filters.length > 0){
			deNombre = filters[0] != null ? filters[0] : "";
			deApellidoPaterno = filters[1] != null ? filters[1] : "";
			deApellidoMaterno = filters[2] != null ? filters[2] : "";
			deDocIdentidad = filters[3] != null ? filters[3] : "";
			coDepartamento = filters[4] != null ? filters[4] : "";
			coProvincia = filters[5] != null ? filters[5] : "";
			coDistrito = filters[6] != null ? filters[6] : "";
			coEstadoCivil = filters[7] != null ? filters[7] : "";			
		}
		
		List<Object> params = new ArrayList<Object>();
		StringBuffer query = new StringBuffer();
		
		query.append(" select count(*) ");		
		query.append(" from clpb_cliente_persona cliente ");
		query.append(" inner join clpm_ubigeo ub on cliente.co_ubigeo = ub.id ");
		query.append(" inner join clpb_estado_civil ec on cliente.co_estado_civil = ec.id ");
		query.append(" inner join clpb_tarjeta_persona tp on cliente.co_tarjeta_persona = tp.id ");
		
		query.append(" where cliente.st_cliente_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and cliente.st_habilitado = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and tp.st_tarjeta_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and tp.da_fecha_anulacion is null ");
		
		if(StringUtils.isNotBlank(deNombre)){
			query.append(" and trim(upper(cliente.de_nombre)) like upper(?)");
			params.add("%"+deNombre.trim()+"%");
		}		
		
		if(StringUtils.isNotBlank(deApellidoPaterno)){
			query.append(" and trim(upper(cliente.de_ape_paterno)) like upper(?)");
			params.add("%"+deApellidoPaterno.trim()+"%");
		}
		
		if(StringUtils.isNotBlank(deApellidoMaterno)){
			query.append(" and trim(upper(cliente.de_ape_materno)) like upper(?)");
			params.add("%"+deApellidoMaterno.trim()+"%");
		}
		
		if(StringUtils.isNotBlank(deDocIdentidad)){
			query.append(" and trim(cliente.co_code_numero_documento) like ?");
			params.add("%"+deDocIdentidad.trim()+"%");
		}
		
		if(StringUtils.isNotBlank(coDepartamento) && !coDepartamento.equals("-1")){
			query.append(" and ub.co_departamento = ? ");
			params.add(coDepartamento);
		}
		
		if(StringUtils.isNotBlank(coProvincia) && !coProvincia.equals("-1")){
			query.append(" and ub.co_provincia = ? ");
			params.add(coProvincia);
		}
		
		if(StringUtils.isNotBlank(coDistrito) && !coDistrito.equals("-1")){
			query.append(" and ub.co_distrito = ? ");
			params.add(coDistrito);
		}
		
		if(StringUtils.isNotBlank(coEstadoCivil) && !coEstadoCivil.equals("-1")){
			query.append(" and cliente.co_estado_civil = ? ");
			params.add(coEstadoCivil);
		}
		
		int rows = 0;		
		if(params.size() > 0){
			rows = jdbcTemplate.queryForInt(query.toString(), params.toArray());
		}else{
			rows = jdbcTemplate.queryForInt(query.toString());
		}
		
		return rows;
	}

	public List<BNClientesPersona> buscarClientesPersona(int firstResult,
			int maxResults, String orderBy, boolean ascending, String[] filters) {
		
		String deNombre = "";
		String deApellidoPaterno = "";
		String deApellidoMaterno = "";
		String deDocIdentidad = "";
		String coDepartamento = "";
		String coProvincia = "";
		String coDistrito = "";
		String coEstadoCivil = "";
		
		maxResults = maxResults + firstResult;
		if(filters != null && filters.length > 0){
			deNombre = filters[0] != null ? filters[0] : "";
			deApellidoPaterno = filters[1] != null ? filters[1] : "";
			deApellidoMaterno = filters[2] != null ? filters[2] : "";
			deDocIdentidad = filters[3] != null ? filters[3] : "";
			coDepartamento = filters[4] != null ? filters[4] : "";
			coProvincia = filters[5] != null ? filters[5] : "";
			coDistrito = filters[6] != null ? filters[6] : "";
			coEstadoCivil = filters[7] != null ? filters[7] : "";			
		}
		
		List<Object> params = new ArrayList<Object>();
		StringBuffer query = new StringBuffer();
		
		if(firstResult > 0){
			query.append(" select * from ( ");
			query.append(" select slct.*,rownum rownum_ from ( ");
		}else{
			query.append(" select * from ( ");
		}		
		
		query.append(" select ");
		query.append("	cliente.id, ");
		query.append(" 	cliente.de_nombre as deNombre, ");
		query.append(" 	cliente.de_ape_paterno as deApePaterno, ");
		query.append(" 	cliente.de_ape_materno as deApeMaterno, ");
		query.append(" 	cliente.co_code_numero_documento as coCodeNumeroDocumento, ");
		query.append(" 	trim(cliente.de_nombre)||' '|| trim(cliente.de_ape_paterno)||' '||trim(cliente.de_ape_materno) as deClientePersona, ");
		
		query.append("	ub.de_departamento as deDepartamento, ");
		query.append("	ub.de_provincia as deProvincia, ");
		query.append("	ub.de_distrito as deDistrito, ");
		query.append("	ec.de_estado_civil as deEstadoCivil ");
		
		query.append(" from clpb_cliente_persona cliente ");
		query.append(" inner join clpm_ubigeo ub on cliente.co_ubigeo = ub.id ");
		query.append(" inner join clpb_estado_civil ec on cliente.co_estado_civil = ec.id ");
		query.append(" inner join clpb_tarjeta_persona tp on cliente.co_tarjeta_persona = tp.id ");
		
		query.append(" where cliente.st_cliente_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and cliente.st_habilitado = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and tp.st_tarjeta_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and tp.da_fecha_anulacion is null ");
		
		if(StringUtils.isNotBlank(deNombre)){
			query.append(" and trim(upper(cliente.de_nombre)) like upper(?)");
			params.add("%"+deNombre.trim()+"%");
		}		
		
		if(StringUtils.isNotBlank(deApellidoPaterno)){
			query.append(" and trim(upper(cliente.de_ape_paterno)) like upper(?)");
			params.add("%"+deApellidoPaterno.trim()+"%");
		}
		
		if(StringUtils.isNotBlank(deApellidoMaterno)){
			query.append(" and trim(upper(cliente.de_ape_materno)) like upper(?)");
			params.add("%"+deApellidoMaterno.trim()+"%");
		}
		
		if(StringUtils.isNotBlank(deDocIdentidad)){
			query.append(" and trim(cliente.co_code_numero_documento) like ?");
			params.add("%"+deDocIdentidad.trim()+"%");
		}
		
		if(StringUtils.isNotBlank(coDepartamento) && !coDepartamento.equals("-1")){
			query.append(" and ub.co_departamento = ? ");
			params.add(coDepartamento);
		}
		
		if(StringUtils.isNotBlank(coProvincia) && !coProvincia.equals("-1")){
			query.append(" and ub.co_provincia = ? ");
			params.add(coProvincia);
		}
		
		if(StringUtils.isNotBlank(coDistrito) && !coDistrito.equals("-1")){
			query.append(" and ub.co_distrito = ? ");
			params.add(coDistrito);
		}
		
		if(StringUtils.isNotBlank(coEstadoCivil) && !coEstadoCivil.equals("-1")){
			query.append(" and cliente.co_estado_civil = ? ");
			params.add(coEstadoCivil);
		}
		
		query.append(" order by cliente.id desc ");
		
		query.append(" ) slct WHERE rownum <= ").append(maxResults);
		
		if(firstResult > 0){
			query.append(" ) WHERE rownum_ > ").append(firstResult);
		}
		
		System.out.println("* ClientePersonaDaoImpl.buscarClientesPersona: "+query.toString());
		
		BNClientesPersona bean = null;
		List<BNClientesPersona> listBean = new ArrayList<BNClientesPersona>();
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		
		if(params.size() > 0){
			list = jdbcTemplate.queryForList(query.toString(), params.toArray());
		}else{
			list = jdbcTemplate.queryForList(query.toString());
		}
		
		if(ValidationUtil.validateList(list)){
			for (Map<String, Object> map : list) {
				
				bean = new BNClientesPersona();
				bean.setId(new Long(map.get("id").toString()));
				bean.setDeNombre(map.get("deNombre").toString());
				bean.setDeApePaterno(map.get("deApePaterno").toString());
				bean.setDeApeMaterno(map.get("deApeMaterno").toString());
				bean.setCoCodeNumeroDocumento(map.get("coCodeNumeroDocumento").toString());
				bean.setDeClientePersona(map.get("deClientePersona").toString());
				
				if(map.get("deDepartamento") != null){
					bean.setDeDepartamento(map.get("deDepartamento").toString());
				}
				
				if(map.get("deProvincia") != null){
					bean.setDeProvincia(map.get("deProvincia").toString());
				}
				
				if(map.get("deProvincia") != null){
					bean.setDeDistrito(map.get("deDistrito").toString());
				}
				
				if(map.get("deEstadoCivil") != null){
					bean.setDeEstadoCivil(map.get("deEstadoCivil").toString());
				}
				
				listBean.add(bean);
			}
		}
		
		return listBean;
	}
}
